package com.pro.common.modules.service.dependencies.util;

import cn.hutool.core.util.StrUtil;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;

import java.net.URI;
import java.net.URISyntaxException;

public class RefererUtil {

    private static final String REFERER_HEADER = "Referer";
    private static final String ORIGIN_HEADER = "Origin";

    /**
     * 获取来源域名（主要方法）
     */
    public static String getRefererDomain(HttpServletRequest request) {
        String refererUrl = getRefererUrl(request);
        if (StrUtil.isBlank(refererUrl)) {
            return null;
        }

        return extractDomainFromUrl(refererUrl);
    }

    /**
     * 获取完整的 Referer URL
     */
    public static String getRefererUrl(HttpServletRequest request) {
        // 优先从 Referer 头获取
        String referer = request.getHeader(REFERER_HEADER);
        if (!StrUtil.isBlank(referer)) {
            return referer;
        }

        // 其次从 Origin 头获取（用于 CORS 请求）
        String origin = request.getHeader(ORIGIN_HEADER);
        if (!StrUtil.isBlank(origin)) {
            return origin;
        }

        return null;
    }

    /**
     * 从 URL 中提取域名
     */
    private static String extractDomainFromUrl(String url) {
        try {
            URI uri = new URI(url);
            String domain = uri.getHost();

            // 处理带 www 的域名，统一返回根域名
            if (domain != null && domain.startsWith("www.")) {
                domain = domain.substring(4);
            }

            return domain;
        } catch (URISyntaxException e) {
            // 如果 URI 解析失败，尝试简单的字符串处理
            return extractDomainByString(url);
        }
    }

    /**
     * 字符串方式提取域名（备选方案）
     */
    private static String extractDomainByString(String url) {
        if (StrUtil.isBlank(url)) {
            return null;
        }

        // 移除协议前缀
        String domain = url.replaceFirst("^(https?://)?(www\\.)?", "");

        // 移除路径和参数
        int slashIndex = domain.indexOf('/');
        if (slashIndex != -1) {
            domain = domain.substring(0, slashIndex);
        }

        // 移除端口号
        int colonIndex = domain.indexOf(':');
        if (colonIndex != -1) {
            domain = domain.substring(0, colonIndex);
        }

        return domain;
    }
}
